/*
多重for循环
函数封装
指针、realloc函数
宏
自增运算符
*/
#include <stdio.h>
#include <stdlib.h>

#define MAX_NUM 5

int *get_non_dup_array(int *array, int *cnt);
void print_array(int *array, int cnt);

int main(int argc, const char *argv[])
{
    // 统计总次数
    int cnt=0;
    // 开辟内存块，用以存储所有不重复的数字
    // array指针指向存储所有不重复的数字的内存块
    int *array = NULL;

    // 开辟内存块，用以存储所有不重复的数字
    // 并返回内存块首地址
    array = get_non_dup_array(array, &cnt);
    // 打印内存块里存储的所有不重复的数字
    print_array(array, cnt);

    free(array);

    return 0;
}

/* 开辟内存块，用以存储所有不重复的数字，并返回内存块首地址 */
int *get_non_dup_array(int *array, int *cnt)
{
    // 个位、十位、百位的数字
    int h, t, s = 0;
    int *tmp = NULL;

    for (h=1; h<MAX_NUM; h++) {
        for (t=1; t<MAX_NUM; t++) {
            for (s=1; s<MAX_NUM; s++) {
                if (h!=t && t!=s && h!=s) {
                    (*cnt)++;
                    // 判断分配内存是否成功
                    if ((tmp=(int *)realloc(array, sizeof(int)*(*cnt))) != NULL) {
                        array = tmp;
                        *(array+(*cnt)-1) = h*100+t*10+s;
                    } else {
                        fprintf(stdout, "realloc block error");
                        exit(0);
                    }
                }
            }
        }
    }

    return array;    
}

/* 打印内存块里存储的所有不重复的数字 */
void print_array(int *array, int cnt)
{
    for (int idx=0; idx<cnt; ) {
        fprintf(stdout, "%d", *(array+idx));
        if (++idx%5!=0) {
            fprintf(stdout, "\t");
        } else {
            fprintf(stdout, "\n");
        }
    }
    fprintf(stdout, "\n共有个%d不重复的数字\n", cnt);
}